﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Text.RegularExpressions; /* Agregada por mi */
using PolimericosABM.data;
using PolimericosABM.services;

namespace PolimericosABM
{
    public partial class frmBuscarPoli : Form
    {
        // String que representa la expresión regular para validar
        // que el dato en el combobox cbxLinea tenga formato correcto
        public const string ExprRegLinea = @"[125]{1}[a-zA-Z]{4}[1-9]{1}";

        public const string ExprRegEstructura = @"^[0-9]+$";

        private PolimeroService _service = new PolimeroService();

        public frmBuscarPoli()
        {
            InitializeComponent();
            //cbxCadenaTipo.SelectedIndex = 0;
            cbxRegion.SelectedIndex = 0;
            cbxFase.SelectedIndex = 0;
        }

        /// <summary>
        /// Valida los datos ingresados por el usuario
        /// </summary>
        /// <returns>True si no hay error</returns>
        private bool ValidarTodo()
        {
            bool error = false;
            /*
            Chequeo de datos cargados correctamente en el formulario
             */
            eppMain.Clear();

            if (!ValidarLinea(cbxLinea.Text))
            {
                eppMain.SetError(cbxLinea, "Codificación de nombre de línea #AABB#:\n" +
                                           "#: número del tipo de linea (1, 2 o 5)\n" +
                                           "AA: 2 letras codificando lugar de origen.\n" +
                                           "BB: 2 letras codificando lugar de destino.\n" +
                                           "#: número de línea.");
                error = true;
            }

            if (!ValidarEstructura(cbxEstructura.Text))
            {
                eppMain.SetError(cbxEstructura, "Sólo se pueden agregar caracteres numéricos (0-9) en el campo Estructura.");
                error = true;
            }
            
            return !error;
        }

        private void frmAddPoli_Load(object sender, EventArgs e)
        {
            
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
        }

        private void cbxRegion_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Si cambia el valor del indice limpio los combobox cbxLinea y cbxEstructura
            cbxLinea.Items.Clear();
            cbxLinea.Text = "";
            //cbxLinea.Refresh();
            cbxEstructura.Items.Clear();
            cbxEstructura.Text = "";
            cbxLinea.Refresh();
            try
            {
                cbxLinea.ResetText();
                cbxLinea.Items.Clear();
                string region = cbxRegion.SelectedItem.ToString();
                List<string> lineas = _service.GetLineas(region);

                cbxLinea.Items.AddRange(lineas.ToArray());
                if (cbxLinea.Items.Count > 0)
                {
                    cbxLinea.SelectedIndex = 0;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error al intentar abrir la base", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // Si hay algún elemento en el combobox de líneas o si se ha escrito algo en el mismo
            CargarEstructuras();
        }

        public bool ValidarLinea(string linea)
        {
            if (linea != null)
            {
                return Regex.IsMatch(linea, ExprRegLinea);
            }
            else
            {
                return false;
            }
        }

        public bool ValidarEstructura(string estructura)
        {
            if (estructura != null)
            {
                return Regex.IsMatch(estructura, ExprRegEstructura);
            }
            else
            {
                return false;
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            // Buscar por el/los polimerico/s que se encuentre/n en esa ubicación
            // y cargarlo/s dentro del DataGridView
            try
            {
                Cursor = Cursors.WaitCursor;
                PolimeroFilter filter = new PolimeroFilter();
                filter.Region = cbxRegion.Text;
                filter.Linea = cbxLinea.Text;
                filter.Estructura = Convert.ToInt32(cbxEstructura.Text.ToString());
                filter.Fase = Convert.ToInt16(cbxFase.SelectedItem.ToString());
                polimeroBindingSource.DataSource = _service.GetPolimeroByLocation(filter);
                Cursor = Cursors.Default;
            }
            catch (Exception ex)
            {
                Cursor = Cursors.Default;
                MessageBox.Show("Error al obtener los polimeros", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cbxLinea_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Si cambia el valor del indice limpio el combobox cbxEstructura
            cbxEstructura.Items.Clear();
            cbxEstructura.Text = "";
            cbxLinea.Refresh();
            // Si hay algún elemento en el combobox de líneas o si se ha escrito algo en el mismo
            CargarEstructuras();
        }

        private void CargarEstructuras()
        {
            // Si hay algún elemento en el combobox de líneas o si se ha escrito algo en el mismo
            if (cbxLinea.Items.Count != 0 | cbxLinea.Text.Length != 0)
            {
                try
                {
                    cbxEstructura.ResetText();
                    cbxEstructura.Items.Clear();
                    string region = cbxRegion.SelectedItem.ToString();
                    // Uso el Text y no el SelectedItem porque este combobox tiene la opción de editar el texto
                    string linea = cbxLinea.Text.ToString();
                    List<string> estructuras = _service.GetEstructuras(region, linea);

                    cbxEstructura.Items.AddRange(estructuras.ToArray());
                    if (cbxEstructura.Items.Count > 0)
                    {
                        cbxEstructura.SelectedIndex = 0;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error al intentar abrir la base", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }
}
